from integrations.langchain_client import LangchainClient
import yaml
import asyncio

from langchain_core.messages import HumanMessage, SystemMessage
from langchain.agents import AgentType, initialize_agent

from tools.log_handler import logger
from config.PathConfig import PROMPTS_CONFIG
from core.session_history import SessionManager
from tools.web_search import WebSearchTool
from tools.doc_retriever import LocalSearchTool

class IntentHandler:
    def __init__(self,default_role):
        # 初始化 LangchainClient
        self.client = LangchainClient()

        # 加载提示词配置
        with open(PROMPTS_CONFIG, "r", encoding="utf-8") as f:
            prompts = yaml.safe_load(f)["prompts"]

        # 意图识别提示词
        self.intent_prompt = prompts["意图识别"]["template"]

        # 角色提示词字典
        self.role_prompts = {
            default_role: prompts[default_role]["template"],
            # 可扩展其他角色，例如 "小王": prompts["小王"]["template"]
        }
        # 默认聊天提示词（用于未定义角色时）
        self.chat_prompt = prompts[default_role]["template"]  # 默认使用小李的提示词

        # 初始化 SessionManager
        self.session_manager = SessionManager(default_role=default_role)

        # 初始化工具实例
        self.web_search_tool = WebSearchTool()  # 网络搜索工具
        self.local_search_tool = LocalSearchTool() # 如果需要本地搜索工具

        logger.info("IntentHandler 初始化完成")

    # 意图识别
    async def detect(self, messages: list, tools=None) -> str:
        """messages 消息列表"""
        try:
            response = await self.client.async_chat(messages)  # 使用 self.client 而非 self.llm
            logger.info(f"用户意图: {response.content}")
            return response.content
        except Exception as e:
            logger.error(f"意图识别失败: {e}")
            return "normal_chat"  # 默认回退到普通聊天

    async def process(self, user, user_input):
        # 初始化用户会话
        self.session_manager.init_session(user)

        # 检查是否为角色切换命令
        if user_input.startswith("切换到"):
            new_role = user_input.replace("切换到", "").strip()
            result = self.session_manager.switch_role(user, new_role, self.role_prompts)
            return result

        # 获取当前角色的提示词
        current_role = self.session_manager.current_role[user]
        role_prompt = self.role_prompts.get(current_role, self.chat_prompt)

        # 意图识别
        intent_messages = [
            SystemMessage(content=self.intent_prompt),
            *[
                SystemMessage(content=msg["content"]) if msg["role"] == "system"
                else HumanMessage(content=msg["content"])
                for msg in self.session_manager.get_history(user)
            ],  # 添加历史
            HumanMessage(content=user_input),
        ]
        intent_response = await self.client.async_chat(intent_messages)
        intent = intent_response.content.strip()
        logger.debug(f"识别意图 {intent}  {type(intent)}")

        # 根据意图分发处理
        if intent == "normal_chat":
            # 普通聊天
            chat_messages = [
                SystemMessage(content=role_prompt),  # 使用当前角色提示
                *[
                    SystemMessage(content=msg["content"]) if msg["role"] == "system"
                    else HumanMessage(content=msg["content"])
                    for msg in self.session_manager.get_history(user)
                ],
                HumanMessage(content=user_input),
            ]
            response = await self.client.async_chat(chat_messages)
            reply = response.content

            # 更新历史
            self.session_manager.append_message(user, "user", user_input)
            self.session_manager.append_message(user, "system", reply)
            return reply

        elif intent == "tool_chain":
            # 网络搜索工具
            agent = initialize_agent(
                [self.web_search_tool],  # 工具列表
                self.client.client,  # 原始 LLM
                agent=AgentType.STRUCTURED_CHAT_ZERO_SHOT_REACT_DESCRIPTION,
                verbose=True,
                handle_parsing_errors=True
            )
            full_input = "\n".join(
                [msg["content"] for msg in self.session_manager.get_history(user)] + [user_input]
            )
            result = agent.run(user_input)
            logger.info(f"搜索结果：{result}")

            # 更新历史
            self.session_manager.append_message(user, "user", user_input)
            self.session_manager.append_message(user, "system", result)
            return result
        elif intent == "local_search":
             # 本地搜索工具
            agent = initialize_agent(
                [self.local_search_tool],  # 工具列表
                self.client.client,  # 原始 LLM
                agent=AgentType.STRUCTURED_CHAT_ZERO_SHOT_REACT_DESCRIPTION,
                verbose=True,
                handle_parsing_errors=True
            )
            full_input = "\n".join(
                [msg["content"] for msg in self.session_manager.get_history(user)] + [user_input]
            )
            modified_input = f"""请优先从本地知识库搜索信息，若找不到相关内容再使用常规知识。
            用户问题：{user_input}"""
            result = agent.run(modified_input)
            logger.info(f"搜索结果：{result}")

            # 更新历史
            self.session_manager.append_message(user, "user", user_input)
            self.session_manager.append_message(user, "system", result)
            return result
        else:
            return "抱歉，无法识别您的意图，请重试。"